import Vue from 'vue'
import axios from 'axios'
// import { MessageBox } from 'element-ui'
import store from '@/store'
import { getToken /** , setToken, getRefreshToken, setRefreshToken */ } from '@/utils/auth'
// import { post /** get */ } from '@/api/request'
import { $tooltips } from '@/sun-components/SunMsg.js'
const defaultSettings = require('@/settings.js')
// const CancelToken = axios.CancelToken
// 创建一个axios实例
const service = axios.create({
  baseURL: process.env.NODE_ENV === 'development' ? `${defaultSettings.developmentApi}/api/admin/` : '/api/admin', // url = base url + request url,
  // withCredentials: true, // 在跨域请求时发送cookie
  timeout: 0, // request timeout
  headers: { 'X-Requested-With': 'XMLHttpRequest' }
})
// 请求拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = getToken()
    }
    if (store.getters.acadyearterm) {
      config.headers['Acad-Year-Term'] = store.getters.acadyearterm.current?.acad_year_term
    }
    if (config.url.indexOf('/api/') !== -1) {
      config.baseURL = process.env.NODE_ENV === 'development' ? `${defaultSettings.developmentApi}` : ''
    }
    config['cancelToken'] = new axios.CancelToken(function executor(cancel) { // Axios 提供了一个 CancelToken的函数，这是一个构造函数，该函数的作用就是用来取消接口请求的。
      Vue.$httpRequestList.push(cancel) // 存储cancle
    })
    console.log('发起请求----------', config)
    return config
  },
  error => {
    console.log('请求错误时做了什么', error) // for debug
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果您想获得http信息，如头信息或状态
   * Please return  response => response
  */

  /**
   * 通过自定义代码确定请求状态
   */
  response => {
    console.log('通过自定义代码确定请求状态', response)
    let res = response.data
    if (response.config.method === 'delete' && response.status === 204) { // 删除
      res = { code: 0 }
      $tooltips('删除成功!', 'success')
    }
    if (response.config.method === 'delete' && response.status === 200 && res.code === 998) { // 删除
      $tooltips(res.msg, 'error')
    }
    /**
     * 4000 参数错误
     * 5000 配置错误
     * 999 更新失败
     * 5001 非法请求
     * 1001 权限错误
     * 11000 账号密码错误
     * 998 存在课程相关联信息删除失败
     */
    if (res.code === 5000 || res.code === 5001 || res.code === 998 || res.code === 7100) {
      $tooltips(res.msg, 'error')
    }
    if (res.code === 4000 || res.code === 11000 || res.code === 20004 || res.code === 5002 || res.code === 1001 || res.code === 999) {
      $tooltips(res.msg, 'warning')
    }
    // console.log('-------------', res)
    return res
  },
  error => {
    if (error.message === 'interrupt') { // 在响应拦截器里面 统一添加 处理取消请求
      return new Promise(() => {})
    }
    if (error.response === undefined) {
      $tooltips('加载响应数据失败!', 'error')
      return false
    }
    let obj = {}
    if (error.response.status === 422) {
      let messageArray = []
      obj = error.response.data.errors
      Object.values(obj).forEach(function(key) {
        messageArray = [...messageArray, ...key]
      })
      $tooltips(messageArray.join(','), 'error')
      return false
    }
    if (error.response.status === 404) {
      $tooltips(error.response.data.msg || '404：服务端错误(line：' + error.response.data.line + ')', 'error')
      return false
    }
    if (error.response.status === 500 || error.response.status === 400) {
      $tooltips(`服务端错误${error.response.status}`, 'error')
      return false
    }
  }
)
export default service
